﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SMA.GENTEv1.Dados;

namespace SMA.GENTEv1
{
    public class Convencao
    {
        #region Variaveis Membro
        private int _idConvencaoSindicato;
        private Organizacao _sindicato;
        private string _nomeConvencao;
        private DateTime _dtInicio;
        private DateTime _dtFim;
        private DateTime? _dtProrrogacao;
        private DateTime _dataBase;
        private int _jrTrabalhoDiaria;
        private int _jrTrabalhoSemanal;
        private int _jrTrabalhoMensal;
        private string _path;
        private List<ConvencaoAditivo> _aditivos;
        private GENTEEntities _context;
        #endregion
        
        #region Parametros
        public int IdConvencaoSindicato
        {
            get { return _idConvencaoSindicato; }
            set { _idConvencaoSindicato = value; }
        }

        public Organizacao Sindicato
        {
            get { return _sindicato; }
            set { _sindicato = value; }
        }

        public string NomeConvencao
        {
            get { return _nomeConvencao; }
            set { _nomeConvencao = value; }
        }

        public DateTime DtInicio
        {
            get { return _dtInicio; }
            set { _dtInicio = value; }
        }

        public DateTime DtFim
        {
            get { return _dtFim; }
            set { _dtFim = value; }
        }

        public DateTime? DtProrrogacao
        {
            get { return _dtProrrogacao; }
            set { _dtProrrogacao = value; }
        }

        public DateTime DataBase
        {
            get { return _dataBase; }
            set { _dataBase = value; }
        }

        public int JrTrabalhoDiaria
        {
            get { return _jrTrabalhoDiaria; }
            set { _jrTrabalhoDiaria = value; }
        }

        public int JrTrabalhoSemanal
        {
            get { return _jrTrabalhoSemanal; }
            set { _jrTrabalhoSemanal = value; }
        }

        public int JrTrabalhoMensal
        {
            get { return _jrTrabalhoMensal; }
            set { _jrTrabalhoMensal = value; }
        }

        public string Path
        {
            get { return _path; }
            set { _path = value; }
        }

        public List<SMA.GENTEv1.ConvencaoAditivo> Aditivos
        {
            get { return _aditivos; }
            set { _aditivos = value; }
        }
        #endregion

        #region Construtores
        public Convencao()
        {
            _context = new GENTEEntities();
        }

        public Convencao(int _convencao, bool _carregaDados)
        {
            _context = new GENTEEntities();
            if (!_carregaDados)
                this.IdConvencaoSindicato = _convencao;
            else
                Carregar(_convencao, false, false);
        }

        public Convencao(int _convencao, bool _carregaDados, bool _carregaSindicatos, bool _carregaAditivos)
        {
            _context = new GENTEEntities();
            if (!_carregaDados)
                this.IdConvencaoSindicato = _convencao;
            else
                Carregar(_convencao, _carregaSindicatos, _carregaAditivos);
        }
        #endregion

        #region Métodos Privados
        private void Carregar(int _convencao, bool _carregaSindicatos, bool _carregaAditivos)
        {
            try
            {
                var consulta = from convencao in _context.tab_sindicato_convencao
                               where convencao.id_convencao_sindicato == _convencao
                               select new
                               {
                                   convencao.id_convencao_sindicato,
                                   convencao.tab_organizacao.Id_organizacao,
                                   convencao.nome_convencao,
                                   convencao.dt_inicio,
                                   convencao.dt_fim,
                                   convencao.dt_prorrogacao,
                                   convencao.data_base,
                                   convencao.jr_trabalho_diaria,
                                   convencao.jr_trabalho_semanal,
                                   convencao.jr_trabalho_mensal,
                                   convencao.path
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    this._idConvencaoSindicato = list.id_convencao_sindicato;

                    if (_carregaSindicatos)
                        this._sindicato = new Organizacao(list.Id_organizacao);
                    else
                    {
                        this._sindicato = new Organizacao();
                        this._sindicato.IdOrganizacao = list.Id_organizacao;
                    }

                    this._nomeConvencao = list.nome_convencao;
                    this._dtInicio = list.dt_inicio;
                    this._dtFim = list.dt_fim;
                    this._dtProrrogacao = list.dt_prorrogacao;
                    this._dataBase = list.data_base;
                    this._jrTrabalhoDiaria = (list.jr_trabalho_diaria == null) ? 0 : int.Parse(list.jr_trabalho_diaria.ToString());
                    this._jrTrabalhoSemanal = (list.jr_trabalho_semanal == null) ? 0 : int.Parse(list.jr_trabalho_semanal.ToString());
                    this._jrTrabalhoMensal = (list.jr_trabalho_mensal == null) ? 0 : int.Parse(list.jr_trabalho_mensal.ToString());
                    this._path = list.path;

                    if (_carregaAditivos)
                    {
                        ConvencaoAditivo aditivo = new ConvencaoAditivo();
                        this._aditivos = aditivo.SelectAditivos(list.id_convencao_sindicato, false);
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        private bool ValidaCadastro()
        {
            try
            {
                bool valida = false;

                if (this._sindicato == null)
                    throw new Exception("É necessário informar o sindicato!");

                if (this._sindicato.IdOrganizacao == 0)
                    throw new Exception("É necessário informar o sindicato!");

                if (this._nomeConvencao == string.Empty)
                    throw new Exception("É necessário informar o nome do convênio!");

                if (this._dtInicio == null)
                    throw new Exception("É necessário informar a data inicial!");

                if (this._dtFim == null)
                    throw new Exception("É necessário informar a data final!");

                if (this._dataBase == null)
                    throw new Exception("É necessário informar a data base!");

                if (this._path == string.Empty)
                    throw new Exception("É necessário informar o documento!");

                valida = true;
                return valida;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        private int RetornaIdConvencao()
        {
            try
            {
                int idconvencao = 0;

                var consulta = (from convencao in _context.tab_sindicato_convencao
                                orderby convencao.id_convencao_sindicato descending
                                select new
                                {
                                    convencao.id_convencao_sindicato
                                }).Take(1);

                idconvencao = consulta.ToList()[0].id_convencao_sindicato;

                return idconvencao;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        private void AtualizarPath(string path)
        {
            try
            {
                tab_sindicato_convencao tabConvencao = (from convencao in _context.tab_sindicato_convencao
                                                        where convencao.id_convencao_sindicato == this._idConvencaoSindicato
                                                        select convencao).First();

                tabConvencao.path = path;
                _context.SaveChanges();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #region Métodos Públicos
        public List<Convencao> SelectConvencaoVigencia(int _sindicato, bool _carregaSindicatos, bool _carregaAditivos)
        {
            try
            {
                List<Convencao> listConvencao = new List<Convencao>();

                var consulta = from convencao in _context.tab_sindicato_convencao
                               join organizacao in _context.tab_organizacao on convencao.tab_organizacao.Id_organizacao equals organizacao.Id_organizacao
                               where ((convencao.tab_organizacao.Id_organizacao == _sindicato) || (0 == _sindicato))
                               select new
                               {
                                   convencao.id_convencao_sindicato,
                                   convencao.tab_organizacao.Id_organizacao,
                                   convencao.nome_convencao,
                                   convencao.dt_inicio,
                                   convencao.dt_fim,
                                   convencao.dt_prorrogacao,
                                   convencao.data_base,
                                   convencao.jr_trabalho_diaria,
                                   convencao.jr_trabalho_semanal,
                                   convencao.jr_trabalho_mensal,
                                   convencao.path
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    Convencao convencao = new Convencao();
                    convencao.IdConvencaoSindicato = list.id_convencao_sindicato;

                    if (_carregaSindicatos)
                        convencao.Sindicato = new Organizacao(list.Id_organizacao);
                    else
                    {
                        convencao.Sindicato = new Organizacao();
                        convencao.Sindicato.IdOrganizacao = list.Id_organizacao;
                    }

                    convencao.NomeConvencao = list.nome_convencao;
                    convencao.DtInicio = list.dt_inicio;
                    convencao.DtFim = list.dt_fim;
                    convencao.DtProrrogacao = list.dt_prorrogacao;
                    convencao.DataBase = list.data_base;
                    convencao.JrTrabalhoDiaria = (list.jr_trabalho_diaria == null) ? 0 : int.Parse(list.jr_trabalho_diaria.ToString());
                    convencao.JrTrabalhoSemanal = (list.jr_trabalho_semanal == null) ? 0 : int.Parse(list.jr_trabalho_semanal.ToString());
                    convencao.JrTrabalhoMensal = (list.jr_trabalho_mensal == null) ? 0 : int.Parse(list.jr_trabalho_mensal.ToString());
                    convencao.Path = list.path;

                    if (_carregaAditivos)
                    {
                        ConvencaoAditivo aditivo = new ConvencaoAditivo();
                        this._aditivos = aditivo.SelectAditivos(list.id_convencao_sindicato, false);
                    }

                    listConvencao.Add(convencao);
                }

                return listConvencao;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public void Salvar()
        {
            try
            {
                if (ValidaCadastro())
                {
                    if (this._idConvencaoSindicato == 0)
                    {
                        tab_sindicato_convencao tabSindicatoConvencao = new tab_sindicato_convencao();
                        tabSindicatoConvencao.id_convencao_sindicato = this._idConvencaoSindicato;
                        if (this._sindicato != null)
                            tabSindicatoConvencao.tab_organizacaoReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_organizacao", "Id_organizacao", this._sindicato.IdOrganizacao);
                        else
                            tabSindicatoConvencao.tab_organizacaoReference.EntityKey = null;
                        tabSindicatoConvencao.nome_convencao = this._nomeConvencao;
                        tabSindicatoConvencao.dt_inicio = this._dtInicio;
                        tabSindicatoConvencao.dt_fim = this._dtFim;
                        tabSindicatoConvencao.dt_prorrogacao = this._dtProrrogacao;
                        tabSindicatoConvencao.data_base = this._dataBase;
                        tabSindicatoConvencao.jr_trabalho_diaria = this._jrTrabalhoDiaria;
                        tabSindicatoConvencao.jr_trabalho_semanal = this._jrTrabalhoSemanal;
                        tabSindicatoConvencao.jr_trabalho_mensal = this._jrTrabalhoMensal;
                        tabSindicatoConvencao.path = "";

                        _context.AddTotab_sindicato_convencao(tabSindicatoConvencao);
                        _context.SaveChanges();

                        this._idConvencaoSindicato = RetornaIdConvencao();

                        string _nomearquivo = "";
                        TipoDocumento tipodocto = new TipoDocumento();
                        _nomearquivo = tipodocto.ObterNomeDocumento(this._sindicato.IdOrganizacao, TipoDocumento.TipoDocto.Convencao_Coletiva, this._idConvencaoSindicato.ToString());

                        AtualizarPath(this._path + _nomearquivo);
                        this._path = this._path + _nomearquivo;
                    }
                    else
                    {
                        tab_sindicato_convencao tabSindicatoConvencao = (from convencao in _context.tab_sindicato_convencao
                                                                         where convencao.id_convencao_sindicato == this._idConvencaoSindicato
                                                                         select convencao).First();

                        tabSindicatoConvencao.id_convencao_sindicato = this._idConvencaoSindicato;
                        if (this._sindicato != null)
                            tabSindicatoConvencao.tab_organizacaoReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_organizacao", "Id_organizacao", this._sindicato.IdOrganizacao);
                        else
                            tabSindicatoConvencao.tab_organizacaoReference.EntityKey = null;
                        tabSindicatoConvencao.nome_convencao = this._nomeConvencao;
                        tabSindicatoConvencao.dt_inicio = this._dtInicio;
                        tabSindicatoConvencao.dt_fim = this._dtFim;
                        tabSindicatoConvencao.dt_prorrogacao = this._dtProrrogacao;
                        tabSindicatoConvencao.data_base = this._dataBase;
                        tabSindicatoConvencao.jr_trabalho_diaria = this._jrTrabalhoDiaria;
                        tabSindicatoConvencao.jr_trabalho_semanal = this._jrTrabalhoSemanal;
                        tabSindicatoConvencao.jr_trabalho_mensal = this._jrTrabalhoMensal;

                        _context.SaveChanges();
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion
    }
}
